#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>

namespace zrb 
{
    #pragma db object table("user")
    class User
    {
    public:
        User()
        {}

        //用户名注册 --- 用户ID 昵称 密码 
        User(const std::string& uuid,const std::string& nickname,const std::string& password)
            :_user_id(uuid)
            ,_nickname(nickname)
            ,_password(password)
        {

        }

        //手机号注册 --- 用户ID 手机号 随机昵称
        User(const std::string& uuid,const std::string& phone)
            :_user_id(uuid)
            ,_phone(phone)
            ,_nickname(uuid)
        {

        }

        std::string user_id()
        {
            return _user_id;
        }
        void user_id(const std::string& val)
        {
            _user_id = val;
        }

        std::string nickname()
        {
            if(!_nickname)
                return std::string();

            return *_nickname;
        }
        void nickname(const std::string& val)
        {
            _nickname = val;
        }

        std::string description()
        {
            if(!_description)
                return std::string();

            return *_description;
        }
        void description(const std::string& val)
        {
            _description = val;
        }

        std::string password()
        {
            if(!_password)
                return std::string();

            return *_password;
        }
        void password(const std::string& val)
        {
            _password = val;
        }

        std::string phone()
        {
            if(!_phone)
                return std::string();

            return *_phone;
        }
        void phone(const std::string& val)
        {
            _phone = val;
        }

        std::string avatar_id()
        {
            if(!_avatar_id)
                return std::string();

            return *_avatar_id;
        }
        void avatar_id(const std::string& val)
        {
            _avatar_id = val;
        }


    private:
        friend class odb::access;
        #pragma db id auto //主键自增
        unsigned long _id;
        #pragma db type("varchar(64)") index unique  //为用户id建立索引，并且是唯一，便于查询  
        std::string _user_id; //用户id
        #pragma db type("varchar(64)") index unique
        odb::nullable<std::string> _nickname; //用户昵称，不一定存在，可能是手机号注册
        #pragma db type("varchar(64)")
        odb::nullable<std::string> _description; //用户签名，不一定存在
        #pragma db type("varchar(64)")
        odb::nullable<std::string> _password; //用户密码，不一定存在，可能是验证码登录
        #pragma db type("varchar(64)") index unique
        odb::nullable<std::string> _phone;    //手机号，不一定存在，可能是其他注册方式
        #pragma db type("varchar(64)")
        odb::nullable<std::string> _avatar_id; //头像id，不一定存在
    };
}

// odb -d mysql --generate-query --generate-schema --profile boost/date-time user.hxx